# 要解密的密文：可以理解为经过加密的消息
text = 'mrttaqrhknsw ih puggrur'
# 解密用的密钥：相当于一把"钥匙"
custom_key = 'happycoding'

# 定义维吉尼亚密码的核心函数
# message：要加密/解密的消息
# key：密钥（用于计算偏移量）
# direction：方向（1表示加密，-1表示解密）


def vigenere(message, key, direction=1):
    # 记录当前使用密钥中的第几个字符（从0开始数）
    key_index = 0
    # 字母表：包含26个小写字母，用于查找字母位置
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    # 存储最终处理后的消息（加密或解密结果）
    final_message = ''

    # 遍历消息中的每个字符（先转成小写，方便统一处理）
    for char in message.lower():

        # 如果不是字母（比如空格、标点），直接加到结果里
        # （因为加密解密只处理字母，其他字符不变）
        if not char.isalpha():
            final_message += char
        else:
            # 找到当前要用的密钥字符
            # key_index % len(key)：密钥用完一遍后从头开始用（循环使用）
            key_char = key[key_index % len(key)]
            # 准备用下一个密钥字符
            key_index += 1

            # 计算偏移量：密钥字符在字母表中的位置（a=0, b=1, ..., z=25）
            offset = alphabet.index(key_char)
            # 找到当前字符在字母表中的位置
            index = alphabet.find(char)
            # 计算新位置：
            # 加密时：当前位置 + 偏移量
            # 解密时：当前位置 - 偏移量（因为direction=-1）
            # % 26：超过26个字母时循环（比如z后面是a）
            new_index = (index + offset * direction) % len(alphabet)
            # 把计算出的新字母加到结果里
            final_message += alphabet[new_index]

    # 返回处理后的消息
    return final_message

# 加密函数：调用vigenere函数，方向为1（默认）


def encrypt(message, key):
    return vigenere(message, key)

# 解密函数：调用vigenere函数，方向为-1（反向计算）


def decrypt(message, key):
    return vigenere(message, key, -1)


# 打印结果
print(f'\n加密后的文本: {text}')
print(f'密钥: {custom_key}')
# 用密钥解密
decryption = decrypt(text, custom_key)
print(f'\n解密后的文本: {decryption}\n')
